﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using zeus.Core;

namespace zeus.Web.Controllers.Helpers
{
    public class Polygon
    {
        public static bool PointInPolygon(Posicion p, List<Posicion> poly)
        {
            int n = poly.Count();//numero de los puntos del poligono

            poly.Add(new Posicion { Latitud = poly[0].Latitud, Longitud = poly[0].Longitud });
            Posicion[] v = poly.ToArray();

            int wn = 0;    // the winding number counter

            // loop through all edges of the polygon
            for (int i = 0; i < n; i++)
            {   // edge from V[i] to V[i+1]
                if (v[i].Latitud <= p.Latitud)
                {         // start y <= P.y
                    if (v[i + 1].Latitud > p.Latitud)      // an upward crossing
                        if (isLeft(v[i], v[i + 1], p) > 0)  // P left of edge
                            ++wn;            // have a valid up intersect
                }
                else
                {                       // start y > P.y (no test needed)
                    if (v[i + 1].Latitud <= p.Latitud)     // a downward crossing
                        if (isLeft(v[i], v[i + 1], p) < 0)  // P right of edge
                            --wn;            // have a valid down intersect
                }
            }
            if (wn != 0)
                return true;
            else
                return false;

        }

        private static int isLeft(Posicion P0, Posicion P1, Posicion P2)
        {
            decimal calc = ((P1.Longitud - P0.Longitud) * (P2.Latitud - P0.Latitud)
                    - (P2.Longitud - P0.Longitud) * (P1.Latitud - P0.Latitud));
            if (calc > 0)
                return 1;
            else if (calc < 0)
                return -1;
            else
                return 0;
        }

    }
}
